﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using Microsoft.ApplicationBlocks.Data;
using System.IO;

namespace ObelixTI
{
    public class Plantilla
    {
        #region "Variables privadas"
          private string _conn;

        public enum Permisos
        {
            Consultar = 1,
            Agregar,
            Editar,
            Eliminar,
            Especial
        }

        public enum Accion
        {
            Insertar = 1,
            Eliminar
        }

        #endregion

    
        #region "Constructores"

        public Plantilla(string sqlConnect)
        {
            this._conn = sqlConnect;
        }

        #endregion

    
        

        #region "Metodos Get"
        /// <summary>
        /// Retorna dataset con las palabras reservadas exìstentes
        /// </summary>
        /// <returns></returns>
        public DataSet GetPalabraReservada()
        {
            return SqlHelper.ExecuteDataset(this._conn, CommandType.StoredProcedure, "GetPalabraReservada");
        }

        /// <summary>
        /// Retorna las Plantillas Activas
        /// </summary>
        /// <returns></returns>
        public DataSet GetPlantillas()
        {
            return SqlHelper.ExecuteDataset(this._conn, CommandType.StoredProcedure, "GetPlantillas");
        }


        /// <summary>
        /// Retorna las Plantillas Activas segun el titulo filtro.
        /// </summary>
        /// <param name="Titulo "></param> 
        /// <returns></returns>
        public DataSet GetPlantillasFilter(string Titulo)
        {
            SqlParameter[] param = new SqlParameter[1];
            param[0] = new SqlParameter("@Titulo", Titulo);

            return SqlHelper.ExecuteDataset(this._conn, CommandType.StoredProcedure, "GetPlantillasFilter", param);
        }


        /// <summary>
        /// Retorna las Plantillas Activas
        /// </summary>
        /// <param name="IdPlantilla"></param> 
        /// <returns></returns>
        public DataSet GetInfoPlantilla(int IdPlantilla)
        {
            SqlParameter[] param = new SqlParameter[1];
            param[0] = new SqlParameter("@IdPlantilla", IdPlantilla);

            return SqlHelper.ExecuteDataset(this._conn, CommandType.StoredProcedure, "GetInfoPlantilla", param);
        }


        /// <summary>
        /// Retorna la info de el detalle selecionado
        /// </summary>
        /// <param name="IdPlantilla"></param> 
        /// <returns></returns>
        public DataSet GetDetallePlantilla(int IdPlantilla)
        {
            SqlParameter[] param = new SqlParameter[1];
            param[0] = new SqlParameter("@IdPlantilla", IdPlantilla);

            return SqlHelper.ExecuteDataset(this._conn, CommandType.StoredProcedure, "GetDetallePlantilla", param);
        }
      
         #endregion


        #region "Metodos set"


        /// <summary>
        /// Inserta una nueva palabra reservada
        /// </summary>
        /// <param name="Palabra"></param>
        public string CrearPalabraReservada(String Palabra)
        {
            SqlParameter[] param = new SqlParameter[1];
            param[0] = new SqlParameter("@Palabra", Palabra);


            string retorno = "";

            DataSet ds = SqlHelper.ExecuteDataset(this._conn, CommandType.StoredProcedure, "CrearPalabraReservada", param);

            if (ds.Tables[0].Rows.Count > 0)
            {
                retorno = ds.Tables[0].Rows[0]["RESULTADO"].ToString();
            }
            return retorno;
        }



        /// <summary>
        /// Inserta o actualiza la plantilla
        /// </summary>
        /// <param name="Palabra"></param>
        /// <param name="IdEncabezado"></param>    
        /// <param name="Titulo"></param> 
        /// <param name="Descripcion"></param> 
        /// <param name="Texto1"></param> 
        /// <param name="Texto2"></param> 
        /// <param name="IdUsuario"></param> 
        /// <param name="Accion"></param> 
        public string ActualizarPlantilla(Int16 IdEncabezado, string Titulo, string Descripcion, string Texto1, string Texto2, Int16 IdUsuario, int Accion)
        {
            SqlParameter[] param = new SqlParameter[7];
            param[0] = new SqlParameter("@IdEncabezado", IdEncabezado);
            param[1] = new SqlParameter("@Titulo", Titulo);
            param[2] = new SqlParameter("@Descripcion", Descripcion);
            param[3] = new SqlParameter("@Texto1", Texto1);
            param[4] = new SqlParameter("@Texto2", Texto2);
            param[5] = new SqlParameter("@IdUsuario", IdUsuario);
            param[6] = new SqlParameter("@Accion", Accion);


            string retorno = "";

            DataSet ds = SqlHelper.ExecuteDataset(this._conn, CommandType.StoredProcedure, "ActualizarPlantilla", param);

            if (ds.Tables[0].Rows.Count > 0)
            {
                retorno = ds.Tables[0].Rows[0]["RESULTADO"].ToString();
            }
            return retorno;
        }





        /// <summary>
        /// Activa una plantilla Anterior
        /// </summary>
        /// <param name="IdDetalle"></param>         
        public void ActivarPlantilla(Int32  IdDetalle)
        {
            SqlParameter[] param = new SqlParameter[1];
            param[0] = new SqlParameter("@IdDetalle ", IdDetalle);  
             SqlHelper.ExecuteNonQuery(this._conn, CommandType.StoredProcedure, "ActivarPlantilla", param);
        }

        #endregion

        #region "Metodos Delete"
        /// <summary>
        /// Elimina una palabra reservada
        /// </summary>
        /// <param name="idPalabra"></param>
        /// <returns></returns>
        public DataSet EliminarPalabraReservada(int idPalabra)
         {   
            SqlParameter[] param = new SqlParameter[1];
            param[0] = new SqlParameter("@idPalabra", idPalabra);

            return SqlHelper.ExecuteDataset(this._conn, CommandType.StoredProcedure, "EliminarPalabraReservada", param);
        }

        /// <summary>
        /// Elimina una plantilla
        /// </summary>
        /// <param name="IdPlantilla"></param>
        /// <returns></returns>
        public void  InactivarPlantilla(Int32 IdPlantilla)
        {
            SqlParameter[] param = new SqlParameter[1];
            param[0] = new SqlParameter("@IdPlantilla", IdPlantilla);

            SqlHelper.ExecuteNonQuery(this._conn, CommandType.StoredProcedure, "InactivarPlantilla", param);
        }



        #endregion






        #region "Metodos EDI"

        /// <summary>
        /// Construye un archivo edi, y retorna la ruta donde fue creado
        /// </summary>
        /// <param name="nombre">Nombre del archivo a crear. Por ej: "IFTMBC", o "IFTMIND99B"</param>
        /// <param name="palabrasReservadas">Arreglo que contiene las palabras reservadas y su respectivo valor</param>
        /// <returns></returns>
        public string CrearArchivo(string nombre)
        {
            string rutaArchivo = "";

            /*
             * 1. Se lee la cadena de conexión desde un archivo de configuración, que puede ser de extensión .config o xml.
             * Este archivo lo puede construir como quiera
             */
            string cadenaConexion = this.getCadenaConexion();

           
            /*
             * 2. Se obtiene la plantilla del archivo que se desea generar: Se conecta a la base de datos y 
             * trae la plantilla actual. De pronto para esta parte le podría facilitar mucho guardar el texto
             * de la plantilla en la base de datos. Dejé aquí el nombre de la plantilla porque éste es el que
             * se utiliza en el ambiente de Kimberly, y es el que más conocen
             */
            string textoPlantilla = this.getPlantilla(nombre);

            if (textoPlantilla == "")
            {
                return "No se encontro Informacion de la Plantilla Ingresada";
            }

            DataSet dsPalabras;

            dsPalabras = this.GetPalabraReservada();

            DataTable dtPalabras;
            
            
            string palabra = "";
 
            if (dsPalabras.Tables[1].Rows.Count > 0)
            {
                dtPalabras = dsPalabras.Tables[1].Copy();

              for (int i = 0; i < dtPalabras.Rows.Count ; i++)
              {
                  palabra = dtPalabras.Rows[i]["PALABRA"].ToString();
                  textoPlantilla = textoPlantilla.Replace( palabra, "<" + palabra + ">");
              }


            }

                                   

            /*
             * 4. generar el archivo con extensión .edi
             */
            string resultado = this.generarArchivo(nombre, textoPlantilla);

            //Si llega algo en resultado ocurrió un error
            if (resultado.Length > 0)
            {
                //Esta parte no la he probado como se coporta cuando se llama desde el excel
                throw new Exception(resultado);
            }

            //Retorna la ruta en la que se guardó el archivo
            return rutaArchivo;
        }

        /// <summary>
        /// Este método genera un archivo con extensión .edi. Retorna una cadena vacía si todo sale OK, de lo cotnrario
        /// retorna mensaje del error producido
        /// </summary>
        /// <param name="texto"></param>
        /// <returns></returns>
        private string generarArchivo(string Titulo,  string texto)
        {
            string retorno;
            retorno = "";




            try
            {
                //Se crea el archivo plano, que a ruta donde se genere la tome también del archivo de configuración
                FileStream fs = File.Create(@"C:\Edi\" + Titulo + ".Edi");


                byte[] bytes = Encoding.UTF8.GetBytes(texto.ToString());

                fs.Write(bytes, 0, bytes.Length);

                fs.Flush();
                fs.Close();

             
            }
            catch (Exception ex)
            {
                retorno = ex.Message;
            }

            return retorno;

        }

        /// <summary>
        /// Retorna el texto de la plantilla
        /// </summary>
        /// <returns></returns>
        private string getPlantilla(string nombrePlantilla)
        {
            string retorno;

            retorno = "";

            SqlParameter[] param = new SqlParameter[1];
            param[0] = new SqlParameter("@Titulo", nombrePlantilla);

            DataSet ds = SqlHelper.ExecuteDataset(this._conn, CommandType.StoredProcedure, "GetPlantilla", param);

            if (ds.Tables[0].Rows.Count > 0)
            {
                retorno = ds.Tables[0].Rows[0]["TEXTO"].ToString();
            }

            return retorno;
        }


        /// <summary>
        /// Lee la cadena de conexión desde el archivo de configuración
        /// </summary>
        /// <returns></returns>
        private string getCadenaConexion()
        {
            return "";
        }
        #endregion

        ///////////////////////////////

    }
}
